home *** CD-ROM | disk | FTP | other *** search
- /* Ingen window shuffle! */
- /* Implementerar också filename completion med tab */
- /* Tar första match, nästa tryckning tar nästa match osv.. */
- /* Kompilerar EJ med E v3.1 */
- OPT STACK=$CDAB /* Så att den känns igen med NewZap */
- /* lagom storlek $0800 (2048) bytes */
- CONST FBUF=80
-
- MODULE 'keymap'
- MODULE 'utility'
- MODULE 'exec/ports'
- MODULE 'exec/tasks'
- MODULE 'exec/types'
- MODULE 'exec/interrupts'
- MODULE 'exec/nodes'
- MODULE 'exec/io'
- MODULE 'exec/memory'
- MODULE 'intuition/screens'
- MODULE 'intuition/intuition'
- MODULE 'devices/input'
- MODULE 'devices/inputevent'
- MODULE 'dos/dos'
- MODULE 'dos/dosextens'
-
- OBJECT memess /* från Notify */
- mess : mn
- wind : LONG
- process : LONG
- ENDOBJECT
- OBJECT toraw
- cd : CHAR
- qu : CHAR
- ENDOBJECT
-
- DEF fib:PTR TO fileinfoblock /* global så att värdena sparas */
- DEF old_lock,path_lock,todel
- DEF glob_event:inputevent
- DEF bb[81]:ARRAY,bbp
- DEF lastproc:PTR TO process,lastwin,okwin,flag,
- wins[10]:ARRAY OF LONG,procs[10]:ARRAY OF LONG
- DEF task:PTR TO tc
- DEF sig
- DEF bufw:PTR TO inputevent, buf[5]:ARRAY OF inputevent, bufr:PTR TO inputevent
- DEF bufend
- DEF port:PTR TO mp
- DEF io_req:PTR TO iostd
-
- PROC main()
- DEF handler:is
- DEF lnpek:PTR TO ln,t,s
- bufr:=buf; bufw:=buf; bufend:=5*SIZEOF inputevent + buf
- FOR t:=0 TO 4 DO buf[t].class:=IECLASS_RAWKEY
- IF (fib := New(SIZEOF fileinfoblock)) = 0 THEN CleanUp(20)
- IF openlibs() THEN CleanUp(20)
- sig:=Shl(1,(s:=AllocSignal(-1)))
- task:=FindTask(NIL)
- SetTaskPri(task,5)
- IF (port:=CreateMsgPort())
- lnpek:=port.ln
- lnpek.name:='Shuffle'
- AddPort(port)
- IF (io_req:=CreateIORequest(port,SIZEOF iostd))
- IF OpenDevice('input.device',0,io_req,0) = NIL
- handler.code:={handeven}
- MOVE.L A4,t
- handler.data:=t
- lnpek:=handler.ln
- lnpek.pri:=6; /* just before console */
- lnpek.name:='Shuffle';
- io_req.data:=handler;
- io_req.command:=IND_ADDHANDLER;
- DoIO(io_req);
- serve_handler(); /* never returns... */
- io_req.data:=handler;
- io_req.command:=IND_REMHANDLER;
- DoIO(io_req);
- /* ELSE
- WriteF('No input.device') */
- ENDIF
- DeleteIORequest(io_req)
- /* ELSE
- WriteF('No CreateIORequest') */
- ENDIF
- RemPort(port)
- DeleteMsgPort(port)
- /* ELSE
- WriteF('No CreateMsgPort') */
- ENDIF
- FreeSignal(s)
- IF utilitybase THEN CloseLibrary(utilitybase)
- IF keymapbase THEN CloseLibrary(keymapbase)
- ENDPROC
-
- PROC observe_input() /* Har hittat RawKey */
- DEF i
- IF Long(intuitionbase+52)<>lastwin /* bytt fönster */
- bbp:=0
- lastwin:=Long(intuitionbase+52)
- i:=0
- WHILE (i<10) AND (lastwin<>wins[i]) DO INC i
- IF i<10
- lastproc:=procs[i]
- okwin:=TRUE
- ELSE
- lastproc:=NIL; okwin:=FALSE; flag := TRUE
- ENDIF
- ENDIF
-
- IF okwin
- IF (glob_event.code = $42) AND (glob_event.qualifier = $8000)
- glob_event.class := IECLASS_NULL
- okwin:=FALSE /* ta inte emot fler tecken innan sökningen färdig */
- ENDIF
- MOVE.L bufw,A1
- MOVE.L glob_event,A0
- MOVE.L 6(A0),6(A1)
- MOVE.L 10(A0),10(A1)
- ADDI.L #SIZEOF inputevent,bufw
- IF bufw=bufend THEN bufw:=buf
- Signal(task,sig)
- ENDIF
-
- RETURN
-
- handeven:
- MOVE.L A0,-(A7) /* Spara pekare InputEvent */
- notrawkey:
- MOVE.L A0,D0 /* Slut ? */
- BEQ.S nomore
- CMPI.B #IECLASS_RAWKEY,4(A0) /* Bara RAWKEY intress. */
- BEQ.S rawkey
- MOVE.L (A0),A0 /* Kolla nästa */
- BRA.S notrawkey
-
- rawkey:
- MOVEM.L D1-D7/A0-A6,-(A7) /* Fixa register inför proc. */
- MOVE.L A1,A4 /* ladda A4 */
- MOVE.L A0,glob_event
- observe_input() /* E-funktion */
- MOVEM.L (A7)+,D1-D7/A0-A6 /* Hämta register */
- MOVE.L (A0),A0
- BRA.S notrawkey
-
- nomore:
- MOVE.L (A7)+,D0 /* Avsluta */
- RTS
- ENDPROC
-
- PROC clearit() /* ta bort gamla lock */
- IF old_lock
- bbp := StrLen(bb)
- CurrentDir(old_lock)
- IF path_lock THEN UnLock(path_lock)
- old_lock := NIL
- ENDIF
- flag := NIL
- ENDPROC
-
-
- PROC serve_handler()
- DEF ms:PTR TO memess,t
- DEF t2
- bbp:=0
- LOOP
- IF (Wait(Shl(1,port.sigbit)+sig+SIGBREAKF_CTRL_C) AND SIGBREAKF_CTRL_C) THEN RETURN
- WHILE ms:=GetMsg(port) /* Nytt fönster */
- addwin(ms.wind,ms.process)
- FreeMem(ms,SIZEOF memess)
- ENDWHILE
- WHILE bufr<>bufw
- t:=bufr.code
- t2 := ((t AND $7f) <> $42)
- IF t2 OR flag
- clearit()
- ENDIF
- SELECT t
- CASE $42
- IF bufr.qualifier=$8000 /* Här ska filnamnet kompletteras */
- IF lastproc
- todel := IF old_lock THEN StrLen(bb)-bbp ELSE 0
- PutChar(bbp+bb,0)
- IF old_lock
- complete()
- ELSE
- old_lock:=CurrentDir(lastproc.currentdir)
- t:=FilePart(bb)
- t2:=Char(t)
- PutChar(t,0)
- IF (path_lock:=Lock(bb,ACCESS_READ))
- PutChar(t,t2)
- IF Examine(path_lock,fib)
- complete()
- ENDIF
- ELSE
- clearit()
- ENDIF
- ENDIF
- feedit()
- Delay(2) /* Vänta på att inputströmmen är slut */
- okwin:=TRUE
- ENDIF
- ENDIF
- CASE $41 /* BS */
- IF bbp>0 THEN DEC bbp
- CASE $44 /* RETURN */
- bbp:=0
- CASE $4c /* Arrow Up */
- bbp:=0
- CASE $4d /* Arrow Down */
- bbp:=0
- CASE $4e /* Arrow Right */
- bbp:=0
- CASE $4f /* Arrow Left */
- bbp:=0
- CASE $40 /* Space */
- bbp:=0
- CASE $32 /* CTRL-x */
- IF bufr.qualifier = $8008
- bbp:=0
- ELSE
- bbp:=bbp+MapRawKey(bufr,bb+bbp,FBUF-bbp,NIL)
- ENDIF
-
- DEFAULT
- bbp:=bbp+MapRawKey(bufr,bb+bbp,FBUF-bbp,NIL)
- IF (bbp=1) AND ((Char(bb)="<") OR (Char(bb)=">")) THEN bbp:=0
- ENDSELECT
- bufr:=bufr+SIZEOF inputevent
- IF bufr=bufend THEN bufr:=buf
- ENDWHILE
-
- ENDLOOP
- ENDPROC
-
- PROC addwin(wind:PTR TO window,process)
- DEF lock,s:PTR TO screen,i=0,w:PTR TO window
- lock:=LockIBase(0)
- s:=wind.wscreen
- w:=s.firstwindow
- WHILE i<10 AND w<>NIL
- IF wind=wins[i]
- procs[i]:=process
- i:=10
- ENDIF
- IF w=wins[i]
- w:=s.firstwindow
- i:=i+1
- ELSE
- w:=w.nextwindow
- ENDIF
- ENDWHILE
- IF i<10
- wins[i]:=wind
- procs[i]:=process
- lastwin:=NIL
- ENDIF
- UnlockIBase(lock)
- ENDPROC
-
- PROC openlibs()
- IF (utilitybase:=OpenLibrary('utility.library',37))
- IF ((keymapbase:=OpenLibrary('keymap.library',37))=NIL) THEN CloseLibrary(utilitybase)
- ENDIF
- RETURN (utilitybase=NIL)+(keymapbase=NIL)
- ENDPROC
-
- PROC complete()
- DEF comset,t,fnam,flen
- fnam:=FilePart(bb); flen:=StrLen(fnam);
- LowerStr(fnam)
- REPEAT
- t:=ExNext(path_lock,fib)
- LowerStr(fib.filename)
- IF fib.direntrytype>0 THEN copstr('/',fib.filename+StrLen(fib.filename))
- comset := StrCmp(fnam,fib.filename,flen)
- UNTIL (t=0) OR comset
- IF t AND comset AND ((fnam-bb+StrLen(fib.filename)) < 80)
- copstr(fib.filename,fnam)
- ELSE
- DisplayBeep(NIL)
- clearit()
- ENDIF
- ENDPROC
-
- PROC copstr(str1,str2)
- MOVE.L str1,A0
- MOVE.L str2,A1
- copstr_l1:
- MOVE.B (A0)+,(A1)+
- BNE.S copstr_l1
- ENDPROC
-
- PROC feedit()
- DEF raw_char:toraw,iep:inputevent,i=0
- iep.nextevent:=NIL
- PutLong(iep+10,0)
- iep.class:=IECLASS_RAWKEY
- io_req.data:=iep
- io_req.length:=SIZEOF inputevent
- io_req.command:=IND_WRITEEVENT
- WHILE todel
- DEC todel
- iep.code := $41
- iep.qualifier := $8000
- DoIO(io_req)
- ENDWHILE
- WHILE Char(bb+bbp+i)
- MapANSI(bb+bbp+i,1,raw_char,1,NIL)
- iep.code:=raw_char.cd
- iep.qualifier:=raw_char.qu
- DoIO(io_req)
- INC i
- ENDWHILE
- ENDPROC
-
-